﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace clasesBase
{
    public class FormsUnicos
    {
        static Dictionary<Type, Form> mTipoFormColeccion = new Dictionary<Type, Form>();

        public static Dictionary<Type, Form> MTipoFormColeccion
        {
            get { return mTipoFormColeccion; }
        }

        static public T ObtenerInstancia<T>(Form owner)
            where T : Form
        {
            return ObtenerInstancia<T>(owner, null);
        }

        static public T ObtenerInstancia<T>(Form owner, params object[] args)
            where T : Form
        {
            Form formulario;
            // Busca el formulario en la colección donde se mantienen todos los formularios abiertos.
            if (!mTipoFormColeccion.ContainsKey(typeof(T)))
            {
                // Al no encontrar el formulario, significa que no está creado, por ende, lo crea y lo añade a la colección.
                // Y registra un método remover cuando el formulario se cierra.
                formulario = (Form)Activator.CreateInstance(typeof(T), args);
                mTipoFormColeccion.Add(typeof(T), formulario);
                formulario.Owner = owner;
                formulario.FormClosed += new FormClosedEventHandler(remover);
            }
            else
            {
                // El formulario ya existe. Lo único que hace, es activarlo y darle el foco.
                formulario = (Form)mTipoFormColeccion[typeof(T)];
                formulario.Activate();
            }

            return (T)mTipoFormColeccion[typeof(T)];
        }

        static void remover(object sender, FormClosedEventArgs e)
        {
            // Se quita el manejadro para el evento de cierre y luego se elimina el formulario de la colección
            Form f = sender as Form;
            if (f == null) return;

            f.FormClosed -= new FormClosedEventHandler(remover);
            mTipoFormColeccion.Remove(f.GetType());
        }

        public static void abrirFormulario<T>(Form owner) where T : Form
        {
            T formAbrir = ObtenerInstancia<T>(owner);
            formAbrir.MdiParent = owner;
            formAbrir.Show();
        }
    }
}
